package controleur;

import metier.*;
import utiles.K;
import vue.VueCarte;
import vue.VueParametrageSimulation;
import vue.VuePositionnerFourmilieres;
import vue.VueSimulation;

/**
 * Classe assurant le contrôle de la simulation
 *
 * @author Thomas Folgueral
 * @author Julien Pernot
 * @author Guillaume Peyet
 * @author Guillaume Sainthillier
 */
public class ControllerSimulation {

    private Carte c; //Classe Model
    private VueCarte carte; // Classe View
    private VueParametrageSimulation vps;
    private VuePositionnerFourmilieres vpf;
    private ThreadSimulation threadSimulation; // Thread executant la simulation
    private int timeTick; // Entier désignant la durée du top 
    private boolean first = true;
	private VueSimulation vueSimulation;

    /**
     * Constructeur du controlleur, charge la carte ainsi que les élements à
     * placer sur la carte
     * @param vps
     * @param carte
     */
    public ControllerSimulation(VueParametrageSimulation vps, Carte carte) {

        this.c = carte;
        this.vps = vps;
        
        /* V1
        FourmizLogger.debug(this, "Début du remplissage");
        this.loadElements();

        FourmizLogger.debug(this, "Fin du remplissage");
        */
        this.vpf = new VuePositionnerFourmilieres(this);
        
        this.timeTick = K.TIME_TICK;
        this.initThreadSimulation();
    }

    /**
     * Démarre la simulation
     */
    public void start() {
        if (!threadSimulation.isPlaying()) {
            if (first) {
                first = false;
                this.threadSimulation.start();
            }
            this.threadSimulation.setPlaying(true);

        }
    }

    /**
     * Met en pause la simulation
     */
    public void pause() {
        if (threadSimulation.isPlaying()) {
            this.threadSimulation.setPlaying(false);
        }
    }

    /**
     * Stop la simulation
     */
    public void stop() {
        if (threadSimulation.isPlaying()) {
            this.threadSimulation.exit();
            first = true;
        }
        
        new ControllerParametrageSimulation(this.c.getEnvironnement());
        this.vueSimulation.dispose();
    }

    /**
     * Construit le thread de la simulation
     */
    private void initThreadSimulation() {
        this.threadSimulation = new ThreadSimulation(this);
    }

    /**
     * Charge les éléments sur la carte
     */
    private void loadElements() {
        this.loadFourmilieres();
        this.loadNourriture();
    }

    /**
     * Charge les fourmilières sur la carte
     */
    private void loadFourmilieres() {

        Fourmiliere f = new Fourmiliere(100);

        Fourmi fourmi = new Fourmi(100, 50, f);
        f.addFourmi(new Fourmi(100, 50, f));

        this.c.addElement(f, new Position(1, 1));
        this.c.addElement(fourmi, new Position(4, 4));

    }

    /**
     * Charge les nourritures sur la carte
     */
    private void loadNourriture() {
        Nouriturre nourriture1 = new Nouriturre(1, 1, 100);
        Nouriturre nourriture2 = new Nouriturre(1, 1, 100);
        this.c.addElement(nourriture1, new Position(0, 3));
        this.c.addElement(nourriture2, new Position(4, 0));
    }

    /**
     * Retoure la carte modèle
     *
     * @return la carte
     */
    public Carte getCarte() {
        return c;
    }

    /**
     * Retourne le laps de temps entre chaque action
     *
     * @return le tick
     */
    public int getTimeTick() {
        return timeTick;
    }

    /**
     * Mets à jour le laps de temps entre chaque action
     *
     * @param vitesse la vitesse du vent ("rapide" ou "lent")
     */
    public void setTimeTick(String vitesse) {
        switch (vitesse) {
            case "rapide":
                this.timeTick = timeTick/10;
                break;
            case "lent":
                this.timeTick=timeTick*10;
                break;
        }
    		
    }

    public void setVueSimulation(VueSimulation vue) {
            this.vueSimulation = vue;
    }
	public VueSimulation getVueSimulation() {
		return vueSimulation;
	}


}
